﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace DTTB.Common
{
    public class ConvertObject
    {
        /// <summary>
        /// Chuyển đối tượng Entity sang Dto
        /// </summary>
        /// <typeparam name="TDto"></typeparam>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="entity"></param>
        /// <returns></returns>
        public static TDto ConvertEntityToDto<TDto, TEntity>(TEntity entity)
        {
            var dto = Activator.CreateInstance<TDto>(); // tạo một đối tượng của class Dto

            Type entityType = typeof (TEntity); //lấy kiểu của class cần convert sang Dto

            PropertyInfo[] members = entityType.GetProperties(); // lấy tất cả các property của class hiện tai
            
            Type dtoType = typeof (TDto);
            

            foreach (var item in members)
            {
                if (dtoType.GetProperties().Any(dtoProperty => item.Name == dtoProperty.Name))
                {
                    PropertyInfo prop = dto.GetType().GetProperty(item.Name);
                    prop.SetValue(dto, item.GetValue(entity, null), null);
                }
            }
            return dto;
        }

        /// <summary>
        /// Chuyển danh sách đối tượng Entities sang Dto
        /// </summary>
        /// <typeparam name="TDto"></typeparam>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="entities"></param>
        /// <returns></returns>
        public static IList<TDto> ConvertEntityToDtoList<TDto, TEntity>(IList<TEntity> entities)
        {
            return entities.Select(ConvertEntityToDto<TDto,TEntity>).ToList();
        }

        /// <summary>
        /// Chuyển đối tượng Dto sang Entity
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <typeparam name="TDto"></typeparam>
        /// <param name="dto"></param>
        /// <returns></returns>
        public static TEntity ConvertDtoToEntity<TEntity,TDto >(TDto dto)
        {
            var entity = Activator.CreateInstance<TEntity>();

            Type dtoType = typeof(TDto); //lấy kiểu của class Dto cần convert sang Entity

            PropertyInfo[] members = dtoType.GetProperties(); // lấy tất cả các property của class hiện tai

            Type entityType = typeof(TEntity);


            foreach (var item in members)
            {
                if (entityType.GetProperties().Any(entityProperty => item.Name == entityProperty.Name))
                {
                    PropertyInfo prop = entity.GetType().GetProperty(item.Name);
                    prop.SetValue(entity, item.GetValue(dto, null), null);
                }
            }
            return entity;
        }

        public static IList<TEntity> ConvertDtoToEntityList<TEntity,TDto>(IList<TDto> dtos)
        {
            return dtos.Select(ConvertDtoToEntity<TEntity, TDto>).ToList();
        }
    }
}
